import requests  # 导入requests库，用于发送HTTP请求
import re  # 导入re库，用于正则表达式匹配
import os  # 导入os库，用于文件和目录操作

# 定义当当网搜索页面的基础URL（已进行URL编码）
base_url = f"https://search.dangdang.com/?key=%D3%A2%D3%EF%C2%FE%BB%AD&act=input&show=big&show_shop=0#J_tab"

# 设置HTTP请求头，模拟浏览器访问，避免被网站反爬虫机制识别为爬虫
headers = {"User-Agent": "Mozilla/5.0(Windows;U;Windows NT 6.0 x64;en-US;rv:1.9pre)Gecko/2008072421 Minefield/3.0.2pre"}

# 检查是否存在名为"images"的目录，如果不存在则创建该目录
if not os.path.exists("images"):
    os.makedirs("images")


def fetch_images(url):
    """
    发送HTTP GET请求到指定URL，并返回响应的HTML内容。
    如果请求失败，则打印错误信息并返回None。
    """
    resp = requests.get(url, headers=headers)
    if resp.status_code == 200:
        return resp.text
    else:
        print(f"Failed to fetch page: {url}")
        return None


def parse_images(html):
    """
    使用正则表达式从HTML内容中提取图片URL。
    匹配以'src='或'data-original='开头，并以'.jpg'结尾的URL。
    返回提取到的图片URL列表。
    """
    # 注意：这里的正则表达式可能需要根据网页的实际结构进行调整
    image_tuples = re.findall(r'(src|data-original)=["\'](//.*?\.jpg)["\']', html)  # 匹配以//开头的URL
    image_urls = [img[1] for img in image_tuples]
    return image_urls


def save_images(image_urls):
    """
    遍历图片URL列表，下载图片并保存到本地"images"目录中。
    图片文件名以"image_序号.jpg"的格式命名。
    如果下载过程中发生异常，则打印错误信息。
    """
    for idx, img_url in enumerate(image_urls):
        # 如果URL以//开头，则补充为完整的http或https URL（这里默认使用http）
        if img_url.startswith('//'):
            img_url = 'http:' + img_url

        try:
            # 发送HTTP GET请求到图片URL，并设置stream=True以流式方式下载图片
            img_response = requests.get(img_url, stream=True)
            img_response.raise_for_status()  # 确保请求成功

            # 构造图片文件名
            img_name = os.path.join("images", f"image_{idx + 1}.jpg")

            # 以二进制写入方式打开文件，并将图片内容写入文件
            with open(img_name, "wb") as img_file:
                img_file.write(img_response.content)
            print(f"Saved: {img_name}")
        except Exception as e:
            # 如果下载过程中发生异常，则打印错误信息
            print(f"Could not save image {img_url}: {e}")


def main():
    """
    主函数，用于执行整个图片抓取流程。
    1. 从当当网搜索页面抓取HTML内容。
    2. 解析HTML内容，提取图片URL。
    3. 下载并保存前20张图片到本地。
    """
    html_content = fetch_images(base_url)
    if html_content:
        image_urls = parse_images(html_content)
        # 限制只爬取前20个图片
        save_images(image_urls[:20])


if __name__ == "__main__":
    # 当脚本被直接运行时，调用main函数
    main()